home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Day Cry
/
Day Cry CD.bin
/
oh_towns
/
taropyon
/
splib
/
splib.lzh
/
PRG
/
LHX
/
MAKETBL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-08
|
2KB
|
101 lines
/***********************************************************
maketbl.c -- makes decoding table
***********************************************************/
#include "lh386.h"
#include "slidehuf.h"
#include "intrface.h"
#ifdef __HIGHC__
# pragma On(Align_labels);
#endif
void make_table(short nchar, uchar bitlen[], short tablebits, ushort table[])
{
ushort count[17]; /* âRü[âhÆ╖é▓é╞é╠Åoî╗î┬Éö */
ushort weight[17]; /* 0x10000ul >> bitlen */
ushort start[17]; /* é╗é╠ bitlen é╠ì┼Åëé╠âRü[âhüiì╢ïlé▀üj */
ushort total;
uint i;
int j, k, l, m, n, avail;
ushort *p;
avail = nchar;
/* Åëè·ë╗ */
for (i = 1; i <= 16; i++)
{
count[i] = 0;
weight[i] = 1u << (16 - i);
}
/* Åoî╗ë±Éöé≡ÉöéªéΘ */
for (i = 0; i < nchar; i++)
count[bitlen[i]]++;
/* ì┼Åëé╠âRü[âhé╠îvÄZ */
total = 0;
for (i = 1; i <= 16; i++)
{
start[i] = total;
total += weight[i] * count[i];
}
if ((total & 0xFFFF) != 0)
error(BROKENARC, "Bad table (5)");
/* table ì∞ɼé╠é╜é▀üAtable é╔ôⁿéΘòöò¬é≡ëEïlé▀é╔ò╧ìX */
m = 16 - tablebits;
for (i = 1; i <= tablebits; i++)
{
start[i] >>= m;
weight[i] >>= m;
}
/* table é≡ê∞éΩéΘâRü[âhé╠é╜é▀é╠Åëè·ë╗ */
j = start[tablebits + 1] >> m;
k = 1 << tablebits;
if (j != 0)
for (i = j; i < k; i++)
table[i] = 0;
/* table, tree é╠ì∞ɼ */
for (j = 0; j < nchar; j++)
{
k = bitlen[j];
if (k == 0)
continue;
l = start[k] + weight[k];
if (k <= tablebits)
{
/* table é╔ö[é▄éΘâRü[âh */
for (i = start[k]; i < l; i++)
table[i] = j;
} else
{
/* table é╔ö[é▄éτé╚éóâRü[âh */
p = &table[(i = start[k]) >> m];
i <<= tablebits;
n = k - tablebits;
/* ìéé│ n é╠ tree é≡ì∞éΘ */
while (--n >= 0)
{
if (*p == 0)
{
/* Ä}é¬é▄é╛ëäé╤é─éóé╚é»éΩé╬ì∞éΘ */
right[avail] = left[avail] = 0;
*p = avail++;
}
if (i & 0x8000)
p = &right[*p];
else
p = &left[*p];
i <<= 1;
}
*p = j;
}
/* bitlen é¬ k é╠ăé╠ò╢ÄÜé╠âRü[âh */
start[k] = l;
}
}